perm filename P3JSB.DAT[MM,LCS] blob sn#166796 filedate 1975-07-02 generic text, type T, neo UTF8
TE TAB
	JRST EDGL2	;AND GET MORE

EDITIT:	FOR X IN(D,A,EDCNM){PUSH P,X↔}	;COMMAND WANTS EDIT DONE - DO IT AND DISPATCH
	PUSHJ P,REPLIN
	POP P,EDCNM
	POP P,A
	POPJ P,

REPLIN:	SKIPGE EDCHR	;HERE WE REPLACE THE CURRENT LINE TEXT WITH THE EDITED VERSION
	SOS EDSIZ	;FUDGE FOR LF (IF PRESENT)
	SOS T,EDSIZ	;AS WELL AS FOR ACTIVATION CHAR
	MOVEM T,EDCNM	;A RANDOM PLACE TO SAVE IT
	MOVE T,EDTTBS
	LSH T,1
	ADD T,EDCOLS	;# COLS + 2 * # TABS = TOTAL # CHARS WITH EXPANDED TABS
PUTBAK:	TLO F,NULLIN
	PUSHJ P,EDPUT	;COPY THE TEXT (SHUFFLES ASSUMING C(T) CHARS)
	SKIPN EDCNM
	JRST [	MOVEI C,40	;EMPTY LINE - PUT IN A SPACE FOR DD
		IDPB C,A
		JRST .+1]
FOR X IN(15,12)		;TERMINATE IT
{	MOVEI C,X
	IDPB C,A
}	TDZA C,C
	IDPB C,A
	TLNE A,760000
	JRST .-2	;FLUSH ANY GARBAGE IN THE REST OF THE WORD
	MOVE T,EDCNM	;# CHARS
	ADDI T,2	;ACCOUNT FOR CRLF
	DPB T,[111100,,TT]	;COMBINE WITH # COLS (FROM EDPUT)
	LDB C,[111100,,1(D)]	;OLD # CHARS
	SUB T,C
	ADDM T,CHARS	;UPDATE COUNT BY DIFFERENCE
	HRRM TT,1(D)
	JRST SETWRT
;EDPUT, EDPLR

;EDPUT ADJUSTS BUFFER TO TAKE C(T)+3 (CR-LF-NUL) CHARS INSTEAD OF THE CURRENT LINE,
;THEN COPIES C(EDCNM) CHARS FROM BUF, EXPANDING TABS

EDPUT:	ADDI T,4+2+5*LLDESC	;<ROUND UP>+<CR-LF>+<EXTRA WDS>
	IDIVI T,5	;# WDS
	TLNE F,OFFEND+PMLIN
	JRST EDPLUZ	;OOPS - IT'S A PHONY LINE
EDPLR:	MOVE A,ARRLIN
	HRRZ B,-1(A)	;OLD # WDS
	CAIN T,-2(B)
	JRST EDPS
	CAIL T,-2(B)
	TLO F,NOCHK
	MOVE B,T
	PUSH P,1(A)
	MOVE T,(A)
	PUSH P,T
	HRLM P,(T)
	MOVS T,T
	HRRM P,(T)
	PUSHJ P,FSGIVE
	TLZ F,NOCHK
	PUSHJ P,FSGET
	MOVSI T,TXTCOD
	HLLM T,-1(A)
	MOVEM A,ARRLIN
	POP P,T
	MOVEM T,(A)
	HRLM A,(T)
	MOVS T,T
	HRRM A,(T)
	POP P,T
	MOVEM T,1(A)
	TLNE T,WINBIT
	MOVEM A,WINLIN
	SETOM LLDESC(A)
	CAIG B,LLDESC+1
	JRST EDPS
	MOVSI T,LLDESC(A)
	HRRI T,LLDESC+1(A)
	ADDI B,(A)
	BLT T,-1(B)
			;FALLS THRU
;EDPS, EDPL, EDPLUZ

EDPS:	AOS T,TXTNUM
	MOVEM T,2(A)
	MOVEI D,(A)
	ADD A,[440700,,LLDESC]
	MOVE B,[440700,,BUF]
	MOVEI TT,
	SKIPN T,EDCNM
	POPJ P,
	TLZ F,NULLIN
EDPL:	ILDB C,B
	IDPB C,A
	CAIE C,11	;THE ONLY THING WE WORRY ABOUT
	AOJA TT,[	SOJG T,EDPL
			POPJ P,]
	MOVEI C,40	;TAB - APPEND SOME SPACES
	HRLS TT
	TLO TT,-10
	IDPB C,A
	AOBJN TT,.-1
	MOVEI C,11
	IDPB C,A
	SOJG T,EDPL
	POPJ P,

EDPLUZ:	PUSH P,T	;HERE AFTER EDITING LINE N+1 (PHONY NULL LINE MADE AT EDNUL)
	PUSHJ P,INSONA	;MAKE A REAL LINE
	POP P,T		;RESTORE # WORDS
	JRST EDPLR
;EDSNK, EDSNK2, EDSNK3, ESDSP, ESALT

EDSNK:	TRO F,EDITM
	PUSHJ P,DISP
	 XCT LINTST
	TRO F,DSPSCR
	MOVEI DSP,ESDSP-2
	PUSHJ P,LINS1
	JRST EDSNK2
	INCHRW T
	LSH T,-7
	DPB T,[70200,,C]
EDSNK2:	MOVEM C,COMCHR
	TLNN F,OFFEND+PMLIN
	JRST EDSNK3
	PUSH P,B
	PUSH P,D
	PUSH P,TT
	PUSHJ P,INSONA
	POP P,TT
	POP P,D
	POP P,B
EDSNK3:	PUSHJ P,LINSTO
	MOVE C,COMCHR
	ANDI C,577
	CAIE C,415
	POPJ P,
	MOVEI A,1
	JRST MOVARR

ESDSP:	JRST POPJ1
	POPJ P,
	JRST LINTAB
	JRST LINGLP
	JRST ESALT

ESALT:	SUB P,[1,,1]
	MOVE A,ARRLIN
	AOS T,TXTNUM
	HRRM T,2(A)
	POPJ P,
;CRDSP, REGCR, REGCR1, REGCR2

;FOR CR WE DISPATCH ON CONTROL BITS

CRDSP:	NOEDIT!SACMD!SSCMD,,REGCR
	DOEDIT!SSCMD,,CONTCR
	NOEDIT!NOATT,,METACR
	NOEDIT!NOATT,,DUBLCR

	TLO F,OKF
REGCR:	TRNN F,EDITM	;REG CR - IF EDITING
	JRST REGCR1
	PUSHJ P,LECR	;TAKE APPROPRIATE ACTION
	JRST REGCR2	;NO - JUST MOVE
	PUSH P,D
	PUSHJ P,REPRST
	POP P,D
	PUSH P,[1]
	PUSH P,[311]	;SET UP INSERT MODE FOR NEW LINE
	JRST EDTMOR

REGCR1:	AOS (P)
REGCR2:	TRNE F,ATTMOD
	JRST MOVARR
	MOVE B,ARRL	;HERE WE'RE JUST MOVING - SEE WHERE TO
	CAMLE B,LINES
	JUMPG A,INSONE	;GOING OFF THE BOTTOM - ADD A LINE
	JRST MOVARR	;OK - JUST MOVE IT
;CONTCR, CNTCR2, METACR, REPRST, REPRS2

	PUSHJ P,CNTCR2
CONTCR:	TRNE F,EDITM
	POPJ P,
	SKIPN A,SRCOFF
	JRST POPJ1
	HRRZM A,EDMOV
	MOVEI A,
	JRST EDIT

CNTCR2:	MOVE D,[EDOK*10,,EDIT]
	MOVEI A,
	POPJ P,

METACR:	TRNE F,EDITM
	PUSHJ P,LECR	;DO LINE EDIT STUFF IF NECESSARY
	JRST INSONE	;NOT MIDDLE OF LINE - JUST ADD BLANK LINE
REPRST:	MOVN T,EDCNM	;HERE WE STORE THE REST OF THE LINE AFTER THE ACTIVATOR
	ADDM T,EDSIZ	;BY UPDATING ALL THE PARAMS BY THE AMOUNT ALREADY DONE
	AOSG T,EDTABP
	JRST REPRS2
	SOS TT,T	;HERE WE FUDGE FOR THE TAB WHOSE POSITION
	SUB TT,EDPOS	;(AND HENCE SIZE) IS CHANGING (SIGH)
	ORCMI T,7
	ORCMI TT,7
	SUB T,TT
REPRS2:	SUB T,EDPOS
	ADDM T,EDCOLS
	MOVN T,EDTBS
	ADDM T,EDTTBS
	JRST REPLIN
;LECR, DUBLCR, DUBCR2

;HERE WE HANDLE ALL FLAVORS OF CR FROM THE LINE EDITOR
;IF IT'S AT THE END WE JUST REPLACE THE TEXT AND RETURN
;IF IT'S IN THE MIDDLE WE REPLACE UP TO THE BREAK, MAKE A NEW LINE,
;MOVE THE REMAINING TEXT DOWN IN BUF, AND SKIP RETURN

LECR:	TRNN F,EDBRK	;MIDDLE OF LINE?
	JRST [	PUSH P,A
		PUSHJ P,REPLIN	;NO - REPLACE WHOLE LINE
		POP P,A
		POPJ P,]	;& RETURN
	AOS (P)		;TELL CALLER WE'RE SPLITTING A LINE
	MOVE T,EDTBS
	LSH T,1		;2 TABS/TAB
	ADD T,EDPOS
	PUSH P,C
	PUSHJ P,PUTBAK	;PUT FIRST PART BACK
	PUSH P,B
	MOVEI A,1
	PUSHJ P,MOVARR	;TO THE NEXT LINE
	PUSHJ P,INSONA	;AND MAKE A NEW ONE
	POP P,B
	MOVE D,[440700,,BUF]
	ILDB C,B	;COPY REST OF TEXT DOWN WHERE REPLACER EXPECTS IT
	IDPB C,D
	JUMPN C,.-2
	POP P,C
	POPJ P,

DUBLCR:	TRNN F,EDITM
	JRST DUBCR1
	PUSHJ P,LECR
	JRST DUBCR3
	TRZ F,EDITM+EDBRK
	PUSH P,A
	PUSHJ P,REPRST	;PUT THE REST BACK
	POP P,A
DUBCR1:	TRNN F,ARG
	JRST LININS	;NO ARG -ENTER LINE INSERT MODE
DUBCR2:	MOVNS A		;INVERT SENSE OF ARROW MOVING
	JRST INSNUL	;ARG GIVEN - INSERT N BLANK LINES

DUBCR3:	TRNE F,ARG
	JRST DUBCR2
	MOVEI A,1
	PUSHJ P,MOVARR
	JRST LININS
;INSONA, INSONE, INSNUL, INSNLP

;INSNUL INSERTS |C(A)| NULL LINES BEFORE (+) OR AFTER (-) THE ARROW

INSONA:	SKIPA A,[-1]
INSONE:	MOVEI A,1
INSNUL:	MOVM D,A	;# TO INSERT
	JUMPE D,CPOPJ
	PUSH P,A
	ADDM D,LINES
	SKIPG XXLINE		;Are there marks on this page
	JRST .+4
	PUSH P,D
	PUSHJ P,XLALL		;Fix up marks
	POP P,D
	PUSHJ P,LINSET	;# LINES HAS CHANGED
	MOVEI B,(D)
	LSH B,1
	ADDM B,CHARS
	MOVSI T,WINBIT
	SKIPE A,WINLIN
	ANDCAM T,1(A)
	SETZM WINLIN
	MOVEI B,LLDESC+1
	MOVSI C,TXTCOD
	MOVSI E,ARRBIT
	MOVE G,[ARRBIT,,2000]
	MOVE H,[ASCID/ 
/]
INSNLP:	PUSHJ P,FSGET
	HLLM C,-1(A)
	MOVE T,ARRLIN
	HLL T,(T)
	MOVEM T,(A)
	HRLM A,(T)
	ANDCAM E,1(T)
	MOVS T,T
	HRRM A,(T)
	MOVEM A,ARRLIN
	MOVEM G,1(A)
	AOS T,TXTNUM
	MOVEM T,2(A)
	MOVEM H,LLDESC(A)
	SOJG D,INSNLP
	PUSHJ P,SETWRT
	MOVE A,TOPWIN
	SKIPL (P)
	ADD A,(P)	;MOVE WINDOW INSTEAD OF ARROW
	PUSHJ P,SETWIN	;RECOMPUTE
	POP P,A		;ORIGINAL ARG
	JUMPGE A,MOVARR
	TLO F,NULLIN
	TLZ F,PMLIN
	POPJ P,
;LININS, LINSLP, LINS1, LINGLP, LIDSP, LINTAB

LININS:	MOVEI T,"↔"
	DPB T,[10700,,ARRON]
	MOVEM F,FSAV#
	TLZ F,TF1
LINSLP:	PUSHJ P,INSONA
	TRO F,EDITM
	PUSHJ P,DISP
	 XCT LINTST
	MOVEI DSP,LIDSP-2
	PUSHJ P,LINS1
	JRST LINCOM
	JRST LINSLP
	POPJ P,

LINS1:	MOVSI E,LSPC
	SETZB B,TT
	SETOM BUF
	MOVE T,[BUF,,BUF+1]
	BLT T,BUF+37
	MOVE D,[440700,,BUF]
LINGLP:	INCHWL C
	TRNE C,600
	POPJ P,
	TDNE E,CTAB(C)
	XCT @CTAB(C)
	IDPB C,D
	AOJA B,LINGLP

LIDSP:	JRST LINCR1
	POPJ P,
	JRST LINTAB
	JRST LINGLP
	JRST LINALT

LINTAB:	IDPB C,D
	SUB TT,B
	HRLS B
	TLO B,-10
	MOVEI T,40
	IDPB T,D
	AOBJN B,.-1
	IDPB C,D
	ADDI TT,1(B)
	JRST LINGLP